package com.zhhl.util.quartz;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import org.apache.log4j.Logger;
import org.quartz.Calendar;
import org.quartz.impl.calendar.HolidayCalendar;
import org.quartz.impl.calendar.WeeklyCalendar;

/**
 * 有个问题，这些功能直接用quartz1.6的API就能实现了，可是对于设置了weeklyCalendar的，如果某个周日因为倒休变更为了工作日，
 * 该如何设置啊？另外我是动态创建Trigger的 不是通过配置文件
 * 
 * @author Administrator
 *
 */
public class TradeDayCalendar extends HolidayCalendar {
	private static final long serialVersionUID = 1L;
	private static Logger logger = Logger.getLogger(TradeDayCalendar.class);

	public static String DEFAULT_DATE_FROMART = "yyyy-MM-dd";

	private String dateFormat = DEFAULT_DATE_FROMART;

	private void aaa() {
		Calendar obj = null;

		WeeklyCalendar wcal = new WeeklyCalendar(obj);
	}

	public String getDateFormat() {
		return this.dateFormat;
	}

	public void setDateFormat(String dateFormat) {
		this.dateFormat = dateFormat;
	}

	public TradeDayCalendar() {
	}

	public TradeDayCalendar(Calendar baseCalendar) {
		super(baseCalendar);
	}

	public TradeDayCalendar(TimeZone timeZone) {
		super(timeZone);
	}

	public TradeDayCalendar(Calendar baseCalendar, TimeZone timeZone) {
		super(baseCalendar, timeZone);
	}

	/**
	 * 构造一个日历对象，排除指定的那些法定节假日。
	 * 
	 * @param stringDates
	 *            日期列表字符串,一个日期列表字符串，多个日期以逗号隔开，默认的日期格式是 yyyy-MM-dd. 例如 :
	 *            2010-1-01,2010-10-01
	 */
	public TradeDayCalendar(String stringDates) {
		this(null, stringDates);
	}

	/**
	 * 构造一个日历对象，排除指定的那些法定节假日。
	 *
	 * @param baseCalendar
	 *            , 与本日历对象关联的基础日历对象，在基础日历对象的基础上再排除指定的法定节假日，可以是null。
	 * @param stringDates
	 *            日期列表字符串,一个日期列表字符串，多个日期以逗号隔开，默认的日期格式是 yyyy-MM-dd. 例如 :
	 *            2010-1-01,2010-10-01
	 */
	public TradeDayCalendar(Calendar baseCalendar, String stringDates) {
		super(baseCalendar);

		// 将日期字符串解析成字符数组。
		String[] stringDatesArray = stringDates.split(",");
		Date[] dates = null;
		try {
			dates = getDatesFromStrings(stringDatesArray);
		} catch (ParseException e) {
			logger.error(e.getMessage());
		}

		if ((dates != null) && (dates.length == stringDatesArray.length)) {
			if (logger.isDebugEnabled())
				logger.debug("Excluded dates : " + stringDates);
			addExcludedDates(dates);
		} else {
			// 某些日期无法解析。
			throw new IllegalArgumentException(
					"Some configured dates were invalids (not parseable as "
							+ dateFormat + "). Full list of configured dates{"
							+ stringDates + "} valid dates " + stringDates);
		}
	}

	/**
	 * 将日历字符串数组，按照默认的日期格式转换为Date类型的数组。
	 * 
	 * @param stringDatesArray
	 *            日期字符串数组。
	 * @return 转换后的Date型的数组。
	 * @throws ParseException
	 *             输入的日期解析出错，日期格式有问题。
	 */
	private Date[] getDatesFromStrings(String[] stringDatesArray)
			throws ParseException {
		if ((stringDatesArray == null) || (stringDatesArray.length == 0))
			return null;
		Date[] dates = new Date[stringDatesArray.length];
		for (int i = 0; i < stringDatesArray.length; i++) {
			String stringDate = stringDatesArray[i];
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
					this.dateFormat);
			dates[i] = simpleDateFormat.parse(stringDate);
		}
		return dates;
	}

	/**
	 * 循环添加数组中的日期到被排除的日期列表中，会跳过那些无法解析的日期。
	 */
	private void addExcludedDates(Date[] dates) {
		for (int i = 0; i < dates.length; i++) {
			Date legalHoliday = dates[i];
			addExcludedDate(legalHoliday);
		}
	}
}